package ai.zixing.mashibing.advance_class.secend.class01;

/**
 * 小虎去买苹果，商店只提供两种类型的塑料袋，每种类型都有任意数量。
 * 1）能装下6个苹果的袋子
 * 2）能装下8个苹果的袋子
 * 小虎可以自由使用两种袋子来装苹果，但是小虎有强迫症，他要求自己使用的袋子数量必须最少，且使用的每个袋子必须装满。
 * 给定一个正整数N，返回至少使用多少袋子。如果N无法让使用的每个袋子必须装满，返回-1
 */
public class Code01_AppleMinBags {

    public static void main(String[] args) {
        int appleNum = 100;
        for (int i = 1; i <= appleNum; i++) {
            System.out.println(i + " : " + minBags(i));
        }
        minBags(appleNum);
    }

    // 暴力方法
    // 暴力方法执行完之后发现 18个以上苹果是有规律的
    private static int minBags(int apple) {
        if (apple < 0) {
            return -1;
        }
        int bag6 = -1;
        // 尽量使用大袋子
        int bag8 = apple / 8;
        // 8容量袋子装满之后，不够装一袋苹果剩余的苹果个数
        int rest = apple - bag8 * 8;
        // 小于只需要处理剩余 小于 24 之前
        while (bag8 >= 0 && rest < 24) {
            // 剩余的用6容量的袋子装，如果还有剩余，则装不完，返回 -1
            int restUse = rest % 6 == 0 ? (rest / 6) : -1;
            if (restUse != -1) {
                bag6 = restUse;
                break;
            }
            // 从8个中多取8个苹果出来
            rest = apple - 8 * (--bag8);
        }
        return bag6 == -1 ? -1 : bag6 + bag8;
    }

    // 打表法
    private static int minBagAwesome(int apple) {
        // 奇数一定返回 -1
        if ((apple & 1) != 0) {
            return -1;
        }
        // 小于 18 单独处理
        if (apple < 18) {
            return apple == 0 ? 0 :
                    // 等于 6 或 8 是 1
                    (apple == 6 || apple == 8) ? 1 :
                            // 等于 12，14,16 是 2，其它是 -1
                            (apple == 12 || apple == 14 || apple == 16) ? -2 : -1;
        }
        return (apple - 18) / 8 + 3;
    }
}
